home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / snap_1_4 / part01 / source / snapasm.s < prev    next >
Text File  |  1990-02-11  |  8KB  |  234 lines

  1.         XDEF    _interpret       ; Bitmap-to-Ascii function
  2.         XDEF    _CopyFont        ; Copies a font and aligns it to 16 bit.
  3.         XREF    _CharData        ; Font data
  4.         XREF    _SrcData
  5.         XREF    _CharLoc
  6.         XREF    _Modulo
  7.         XREF    _FontWidth
  8.         XREF    _FontHeight
  9.         XREF    _Underscore
  10.         XREF    _TrueUnderscore
  11.         XREF    _LoChar
  12.         XREF    _HiChar
  13.         XREF    _IFlags
  14.  
  15.         XDEF   _myActivateWindow
  16.         XDEF   _myWindowToFront
  17.         XDEF   _myWindowToBack
  18.  
  19.         SECTION CODE
  20.  
  21. USC     equ 1                   ; Interpreted char was underscored
  22. PUSC    equ 2                   ; Prevoius char was underscored
  23. PUS     equ 4                   ; Pending underscored space
  24.  
  25. _interpret:
  26.         link    a5,#0
  27.         movem.l d1-d6/a1,-(sp)   ; Free a couple of registers
  28.         move.l  8(a5),a1         ; Bitmap
  29.         move.w  (a1),d2          ; First row
  30.         moveq   #0,d4            ; Code
  31.         move.b  _LoChar,d4       ; First char
  32.         move.w  _FontWidth,d0
  33.         asl.w   #1,d0            ; Times two for words
  34.         lea     MaskTable,a0
  35.         move.w  0(a0,d0.w),d3    ; d3 := mask
  36.         move.l  _CharData,a0     ; Char image data
  37.         bclr.b  #PUS,_IFlags     ; No pending-underscored-space
  38. .lp1
  39.         cmpi.b  #31,d4           ; Into printable characters yet?
  40.         bhi     .Search          ; If yes, go and start searching
  41.         addq    #1,d4            ; Move to next char
  42.         adda.l  #32,a0           ; Increment bitmap ptr also
  43.         bra     .lp1             ; Back to check again
  44. .Search
  45.         cmp.w   (a0),d2          ; Compare first word
  46.         bne     .tryinverted     ; Not this one
  47.         bclr.b  #USC,_IFlags     ; Assume not underscored
  48.         moveq   #1,d5            ; current word
  49.         moveq   #0,d6            ; Modulo
  50. .morerows
  51.         addq    #2,d6            ; Add modulo - next bit row in image data
  52.         move.w  0(a0,d6.w),d1    ; Character row
  53.         cmp.w   0(a1,d6.w),d1
  54.         beq     .stdmatch        ; Rows matched
  55.         cmp.w   _Underscore,d5   ; Could it be the underscore line?
  56.         bne     .tryinverted     ; Nope
  57.         tst.b   _TrueUnderscore  ; Use true underscore?
  58.         beq     .uscmatch        ; No. Let's hope it's okay
  59.         moveq   #0,d1            ;   00000000
  60.         move.w  0(a0,d6.w),d0    ;   00110000
  61.         or.w    d0,d1            ;   00110000
  62.         rol.l   #2,d1            ; 0011000000
  63.         or.w    d0,d1            ; 0011110000
  64.         ror.l   #1,d1            ;  X01111000
  65.         eor.w   d3,d1            ;   10000111
  66.         or.w    d0,d1            ;   10110111
  67.         move.w  0(a1,d6.w),d0
  68.         eor.w   d0,d1            ;   Zero if equal
  69.                                  ; But, let's skip the last bit since it
  70.                                  ; may be affected by the next character
  71.         lsr.w   #1,d1            ; Shift one step right
  72.         and.w   d3,d1            ; Mask out last bit
  73.         bne     .tryinverted
  74. .uscmatch
  75.         bset.b  #USC,_IFlags     ; Set underscored flag
  76. .stdmatch
  77.         addq    #1,d5            ; Next row in bitmap
  78.         cmp.w   _FontHeight,d5   ; Are we done?
  79.         bne     .morerows        ; Not yet
  80.         cmp.b   #32,d4           ; Space
  81.         bne     .notuspace
  82.         ; Space. Check for underscore
  83.         btst.b  #USC,_IFlags     ; Underscored char?
  84.         beq     .notuspace       ; Nope, everything ok
  85.         ; Underscored space. Check if previous char was underscored
  86.         btst.b  #PUSC,_IFlags    ; Previous char underscored?
  87.         bne     .okuspace        ; Yep, ok underscored space
  88.         ; Previous char not underscored. Set pending-underscored-space flag
  89.         ; and go on to check if the normal underscore char matches
  90.         bset.b  #PUS,_IFlags
  91.         bra     .tryinverted
  92.  
  93. .notuspace
  94. .okuspace
  95.         bclr.b  #PUSC,_IFlags    ; Clear previous-underscored
  96.         btst.b  #USC,_IFlags     ; Underscored char?
  97.         beq     .interpreted     ; Nope
  98.         bset.b  #PUSC,_IFlags    ; Set previous-underscored
  99.         bra     .interpreted     ; Got it
  100.  
  101. .tryinverted
  102.         move.w  (a0),d1          ; Copy first row
  103.         eor.w   d3,d1            ; and invert the bits
  104.         cmp.w   d2,d1            ; Compare inverted rows
  105.         bne     .trybold         ; No match
  106.         moveq   #1,d5            ; current row
  107.         moveq   #0,d6            ; Modulo
  108. .moreinverted
  109.         addq    #2,d6
  110.         move.w  0(a0,d6.w),d1    ; Character row
  111.         eor.w   d3,d1            ; and invert the bits
  112.         cmp.w   0(a1,d6.w),d1
  113.         bne     .trybold         ; Rows didn't match
  114.         addq    #1,d5            ; Next row in bitmap
  115.         cmp.w   _FontHeight,d5   ; Are we done?
  116.         bne     .moreinverted    ; Not yet
  117.         bra     .interpreted     ; Got it
  118.  
  119. .trybold
  120.         move.w  (a0),d1          ; Copy first row
  121.         lsr.w   #1,d1            ; Shift one step left
  122.         or.w    (a0),d1          ; Make bold
  123.         and.w   d3,d1            ; and mask out unwanted bits
  124.         cmp.w   d2,d1            ; Compare bold rows
  125.         bne     .trynext         ; No match
  126.         moveq   #1,d5            ; current row
  127.         moveq   #0,d6            ; Modulo
  128. .morebold
  129.         addq    #2,d6
  130.         move.w  0(a0,d6.w),d1    ; Character row
  131.         lsr.w   #1,d1            ; Shift one step left
  132.         or.w    0(a0,d6.w),d1    ; Make bold
  133.         and.w   d3,d1            ; and mask out unwanted bits
  134.         cmp.w   0(a1,d6.w),d1
  135.         bne     .trynext         ; Rows didn't match
  136.         addq    #1,d5            ; Next row in bitmap
  137.         cmp.w   _FontHeight,d5   ; Are we done?
  138.         bne     .morebold        ; Not yet
  139.         bra     .interpreted     ; Got it
  140.  
  141. .trynext
  142.         adda.l  #32,a0           ; Try next character, 32 bytes/char
  143.         addq    #1,d4            ;
  144.         cmp.b   _HiChar,d4       ; Tried all chars?
  145.         bne     .Search          ; More to try
  146.         move.l  #255,d4          ; Not found
  147.         btst.b  #PUS,_IFlags     ; Hey, perhaps it was an underscored space?
  148.         beq     .interpreted     ; Nope, return not-found
  149.         move.l  #32,d4
  150.  
  151. .interpreted
  152.         move.l  d4,d0
  153.         movem.l (sp)+,d1-d6/a1
  154.         unlk    a5
  155.         rts
  156.  
  157.  
  158. _CopyFont:
  159.         movem.l d2-d5/a2-a3,-(sp)   ; Free a couple of registers
  160.         moveq   #0,d0
  161.         move.l  _CharData,a2        ; a2 := Destination area
  162.         move.l  _CharLoc,a3
  163.         move.b  _LoChar,d5
  164.         move.w  _Modulo,d3
  165.  
  166. .NextChar
  167.         move.w  (a3),d0             ; Get char location
  168.         adda.w  #4,a3               ; To next, and skip width
  169.         move.w  d0,d1
  170.         and.w   #15,d1              ; Shift amount
  171.         eori.b  #15,d1              ; Negate shift value
  172.         addq.b  #1,d1               ; d1 := Shift Amount
  173.  
  174.         move.l  _SrcData,a0
  175.         lsr.w   #3,d0               ; Byte offset
  176.         bclr    #0,d0               ; But we deal in words
  177.         adda.w  d0,a0               ; a0 := chardata
  178.  
  179.         move.w  _FontWidth,d0
  180.         asl.w   #1,d0               ; Times two for words
  181.         lea     MaskTable,a1
  182.         move.w  0(a1,d0.w),d2       ; d2 := mask
  183.  
  184.         moveq   #0,d4
  185.         move.w  _FontHeight,d4
  186.         move.l  a2,a1               ; a1 := Destination area
  187.         adda.w  #32,a2              ; a2 to next dest area
  188.         bra     .loop
  189. .copyrow
  190.         move.l  (a0),d0             ; Get character row
  191.         adda.w  d3,a0               ; Add modulo -- To next row
  192.         lsr.l   d1,d0               ; Shift data to bit 0 alignment
  193.         and.w   d2,d0               ; Mask out unwanted bits
  194.         move.w  d0,(a1)+            ; Save row
  195. .loop
  196.         dbra    d4,.copyrow         ; Do all rows
  197.  
  198.         addq    #1,d5               ; Next char
  199.         cmp.b   _HiChar,d5          ; Finished?
  200.         bne     .NextChar           ; Nope -- do next.
  201.         movem.l (sp)+,d2-d5/a2-a3
  202.         rts
  203.  
  204. MaskTable
  205.         dc.w    $0000
  206.         dc.w    $8000
  207.         dc.w    $c000
  208.         dc.w    $e000
  209.         dc.w    $f000
  210.         dc.w    $f800
  211.         dc.w    $fc00
  212.         dc.w    $fe00
  213.         dc.w    $ff00
  214.         dc.w    $ff80
  215.         dc.w    $ffc0
  216.         dc.w    $ffe0
  217.         dc.w    $fff0
  218.         dc.w    $fff8
  219.         dc.w    $fffc
  220.         dc.w    $fffe
  221.         dc.w    $ffff
  222.  
  223.  
  224. _myActivateWindow:
  225.         rts
  226.  
  227. _myWindowToFront:
  228.         rts
  229.  
  230. _myWindowToBack:
  231.         rts
  232.  
  233.         END
  234.